home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 42
/
Amiga Format AFCD42 (Issue 126, Aug 1999).iso
/
-serious-
/
hardware
/
blizkick
/
modules
/
test.asm
< prev
next >
Wrap
Assembly Source File
|
1999-05-17
|
5KB
|
168 lines
; FILE: Source:modules/Test.ASM REV: 5 --- Complex Module for BlizKick
;
; Example BlizKick Module
; ~~~~~~~~~~~~~~~~~~~~~~~
; This code shows how to create complex BlizKick "Module".
; Should be quite self-explonary... (?)
;
; !CODE MUST BE FULLY PC-RELATIVE!
;
; Written by Harry Sintonen.
; This source code is Public Domain.
;
incdir "include:"
include "exec/types.i"
include "exec/libraries.i"
include "exec/initializers.i"
include "exec/execbase.i"
include "blizkickmodule.i" ; Some required...
MYLIB_VERSION EQU 1
MYLIB_REVISION EQU 2
STRUCTURE mylib,LIB_SIZE
APTR ml_ExecBase
LABEL mylib_SIZEOF
SECTION LIBRARYMODULE,CODE
_DUMMY_LABEL
BK_MODA BKMF_SingleMode,_end,(RTF_COLDSTART)<<24+30<<16+NT_LIBRARY<<8+11,_name,_idstr,mylib_SIZEOF,_funcs,_is,_init
; SINGLE MODE, COLDSTART module, requires KS V30.x or better,
; module type NT_LIBRARY, priority 11.
BK_INITFUNCS _funcs
;------ system interface functions
BK_FUNC my_LIB_OPEN
BK_FUNC my_LIB_CLOSE
BK_FUNC my_LIB_EXPUNGE
BK_FUNC my_LIB_NULL
;------ libraries definitions
BK_FUNC my_GetVBR
BK_FUNC my_SetVBR
BK_ENDFUNCS
; The data table initializes static data structures. The format is specified in
; exec/InitStruct routine's manual pages. The INITBYTE/INITWORD/INITLONG routines are
; in the file "exec/initializers.i". The first argument is the offset from the library
; base for this byte/word/long. The second argument is the value to put in that cell.
; The table is null terminated.
_is INITBYTE LN_TYPE,NT_LIBRARY
;; INITLONG LN_NAME,_name ; No relocs!
INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
INITWORD LIB_VERSION,MYLIB_VERSION
INITWORD LIB_REVISION,MYLIB_REVISION
;; INITLONG LIB_IDSTRING,_idstr ; - "" -
dc.l 0
; This routine gets called after the library has been allocated. The library pointer is
; in D0. The segment list is in A0. If it returns non-zero then the library will be
; linked into the library list.
;
_init movem.l a5/a6,-(sp)
move.l d0,a5
move.l a6,(ml_ExecBase,a5)
lea (_name,pc),a0
move.l a0,(LN_NAME,a5)
lea (_idstr,pc),a0
move.l a0,(LIB_IDSTRING,a5)
move.l a5,d0
movem.l (sp)+,a5/a6
rts
;------------------------------------------------------------------------------------------
; here begins the system interface commands. When the user calls OpenLibrary/CloseLibrary/
; RemoveLibrary, this eventually gets translated into a call to the following routines
; (Open/Close/Expunge). Exec has already put our library pointer in A6 for us. Exec has
; turned off task switching while in these routines (via Forbid/Permit), so we should not
; take too long in them.
;------------------------------------------------------------------------------------------
; Open returns the library pointer in d0 if the open was successful. If the open failed
; then null is returned. It might fail if we allocated memory on each open, or if only
; open application could have the library open at a time...
my_LIB_OPEN
; ( libptr:a6, version:d0 )
tst.w (LIB_OPENCNT,a6)
beq.b .open
.done move.l a6,d0
rts
.open addq.w #1,(LIB_OPENCNT,a6)
bra.b .done
; There are two different things that might be returned from the Close routine. If the
; library is no longer open and there is a delayed expunge then Close should return the
; segment list (as given to Init). Otherwise close should return NULL.
my_LIB_CLOSE
; There are two different things that might be returned from the Expunge routine. If
; the library is no longer open then Expunge should return the segment list (as given
; to Init). Otherwise Expunge should set the delayed expunge flag and return NULL.
;
; One other important note: because Expunge is called from the memory allocator, it may
; NEVER Wait() or otherwise take long time to complete.
my_LIB_EXPUNGE
my_LIB_NULL
moveq #0,d0
rts
; Functions:
; OUT: d0=vbr or zero if no vbr
my_GetVBR
movem.l a5/a6,-(sp)
move.l (ml_ExecBase,a6),a6
moveq #0,d0
btst #AFB_68010,(AttnFlags+1,a6)
beq.b .novbr
lea (.getvbr,pc),a5
jsr (-$1E,a6) ;call Supervisor
.novbr tst.l d0
movem.l (sp)+,a5/a6
rts
.getvbr movec.l vbr,d0
rte
; IN: a0=new vbr, not set if no vbr
; OUT: d0=old vbr, always zero if no vbr
my_SetVBR
movem.l a5/a6,-(sp)
bsr.b my_GetVBR
move.l (ml_ExecBase,a6),a6
btst #AFB_68010,(AttnFlags+1,a6)
beq.b .novbr
lea (.setvbr,pc),a5
jsr (-$1E,a6) ;call Supervisor
.novbr tst.l d0
movem.l (sp)+,a5/a6
rts
.setvbr movec.l a0,vbr
rte
_name dc.b 'testmodule.library',0
_idstr dc.b 'testmodule.library 1.2 (26.2.97)',0
CNOP 0,2
_end
SECTION VERSION,DATA
dc.b '$VER: testmodule.library_MODULE 1.2 (26.2.97)',0